#ifndef __TFP825R6L_H
#define __TFP825R6L_H

#include "bsp.h"
#include "usart.h"

#define USE_USART 					huart3  //通讯串口
#define TFTP_RECEVICED_FLAG	(u3Receiver.recevicedFlag)
#define TFTP_BUFFER					(u3Receiver.buffer)
#define TFTP_RECEIVED_LEN		(u3Receiver.receivedLen)

#define SEARCH_START_ID 0 //0~299
#define SEARCH_COUNT 25   //1~300


//#define TFP_Delay() delay_ms(1000)
//#define TFP_Delay()		CH_Delay(1000)

#define TFP_Delay() 		osDelay(1000)
#define DELAY(x) 				osDelay(x)


//.. 命令码
#define TFTP_GetImg 0x01       //获取图像（包含手指检测）
#define TFTP_Img2Tz 0x02       //特征提取
#define TFTP_Match 0x03        //匹配 2 个特征
#define TFTP_Search 0x04       //在数据库中搜索
#define TFTP_RegModel 0x05     //将 2 个特征合并成 1 个模板
#define TFTP_StoreModel 0x06   //将模板存入数据库
#define TFTP_LoadChar 0x07     //将数据库中的模板导入 CharBuffer(1 or 2)
#define TFTP_UpChar 0x08       //上传 CharBuffer(1 or 2)的数据
#define TFTP_DownChar 0x09     //下载数据到 CharBuffer(1 or 2)
#define TFTP_UpImage 0x0A      //从 ImageBuffer 上传图像
#define TFTP_DeleteChar 0x0C   //从数据库中删除模板
#define TFTP_Empty 0x0D        //清空数据库
#define TFTP_SetSysPara 0x0E   //设置模组参数
#define TFTP_ReadSysPara 0x0F  //读取模组参数
#define TFTP_SetPwd 0x12       //设置模组密码
#define TFTP_VfyPwd 0x13       //验证模组密码
#define TFTP_WriteNotePad 0x18 //写入一条 32 字节备注
#define TFTP_ReadNotePad 0x19  //读取一条 32 字节备注
#define TFTP_TemplateNum 0x1D  //读取数据库中模板数量
#define TFTP_ReadConList 0x1F  //读取数据库中模板的可用标记
#define TFTP_AutoEnroll 0x31   //注册指纹
#define TFTP_AutoIdentify 0x32 //识别指纹
//.. 反馈码
#define RET_OK 0x00             //成功
#define RET_InvalidPacket 0x01  //无效数据包
#define RET_NoFinger 0x02       //传感器未检测到手指
#define RET_StoreImageFail 0x03 //将图像存入 ImageBuffer 失败
#define RET_TooLowQuality 0x06  //图像质量太差而无法提取特征
#define RET_TooFewPoint 0x07    //特征点太少而无法提取特征
#define RET_NotMatched 0x08     //指纹模板匹配不一致
#define RET_NotIdentified 0x09  //没有找到匹配的指纹
#define RET_MergeFail 0x0A      //合并特征失败
#define RET_InvalidTempID 0x0B  //模板 ID 不合法
#define RET_ReadTempFail 0x0C   //从数据库中读出模板失败
#define RET_UpTempFail 0x0D     //上传模板失败
#define RET_ModBusyErr 0x0E     //此时模组不能接收数据包
#define RET_UpImgFail 0x0F      //上传图像失败
#define RET_RemoveTempFail 0x10 //从数据库中删除模板失败
#define RET_RemoveAllFail 0x11  //从数据库中删除所有模板失败
#define RET_InvalidPwd 0x13     //无效密码
#define RET_InvalidImg 0x15     //ImageBuffer 中没有有效的图像数据
#define RET_InvalidMAddr 0x20   //非法的模组地址
#define RET_NeedVfyPwd 0x21     //需要验证密码

//命令包举例
//START 		ADDR 						PID 			LENGTH 			Command 		SUM
//2 字节 		4 字节 					1 字节 		2 字节 			1 字节 			2 字节
//0xEF01 		0xFFFFFFFF 			0x01 			0x0003 			0x01 				0x0005

//响应包举例
//START 	ADDR 		PID 			LENGTH 		Response 	SUM
//2 字节 	4 字节 	1 字节 		2 字节 		1 字节 		2 字节
//0xEF01 0xFFFFFFFF 0x07 0x0003 X SUM

void TFP_Init(void);
u8 TFP_SendCommonCOM(u8 com);         //发送命令
u8 TFP_SendStoreModelCOM(u16 reg_id); //发送 StoreModel 命令
u8 TFP_SendImg2TzCOM(u8 buf_id);      //发送给 Img2Tz 命令
u8 TFP_ExecCOM(u8 com);               //执行命令

u8 TFP_SearchFingerPrint(void);    //指纹查询
u8 TFP_DelateAllFingerPrint(void); //清除所有注册了的指纹

u8 TFP_ExecAutoEnrollCOM(u16 reg_id); //执行注册指纹指令
u8 TFT_ExecAutoIdentifyCOM(void);

HAL_StatusTypeDef TFP_SendDataBuf(u8 *buf, u16 size);

#endif
